//
// Created by kenny on 25-10-27.
//
#include "mcp_retry_send.h"
#include "mcp_net_mgr.h"
#include "mcp_logger.h"
#include "mcp_tcp.h"
#include "mcp_udp.h"

// 示例：在网络管理器中集成重发机制

static mcp_retry_manager_t retry_manager;
static network_manager_t net_manager;

// TCP接收回调
void tcp_recv_handler(uint8_t* data, uint16_t length) {
    LOG_INFO("TCP Received %d bytes from %s\n", length, data);
}
// UDP接收回调
void udp_recv_handler(uint8_t* data, uint16_t length, const char* from_ip, int from_port) {
    LOG_INFO("UDP Received %d bytes from %s:%d: %.*s\n", length, from_ip, from_port, length, data);
}


// 连接状态回调
void status_handler(bool connected, const char* reason) {
    if (connected) {
        LOG_INFO("✓ Connected: %s\n", reason);
    } else {
        LOG_INFO("✗ Disconnected: %s\n", reason);
    }
}

// 重发回调函数
static void resend_message_callback(uint16_t sequence, void* user_data) {
    // 这里重新发送消息
    LOG_INFO("Resending message: sequence=%d", sequence);

    // 从重发管理器中获取消息数据并重新发送
    // 注意：实际实现中需要更复杂的数据管理
}

// 成功回调函数
static void message_success_callback(uint16_t sequence, void* user_data) {
    LOG_INFO("Message confirmed: sequence=%d", sequence);
}

// 全局重发失败回调
static void on_retry_failed_callback(uint16_t sequence, int retry_count) {
    LOG_WARN("Message retry failed: sequence=%d, retry_count=%d", sequence, retry_count);
}

// 全局超时回调
static void on_message_timeout_callback(uint16_t sequence) {
    LOG_ERROR("Message timeout: sequence=%d", sequence);
}

// 初始化
void network_init() {
    // 初始化重发管理器
    mcp_retry_manager_init(&retry_manager, 100);
    mcp_retry_manager_set_callbacks(&retry_manager,
                                   on_retry_failed_callback,
                                   on_message_timeout_callback);

    // 初始化网络管理器
    network_manager_init(&net_manager, tcp_recv_handler,
                        udp_recv_handler, status_handler);
}

// 发送消息并启动重发机制
int send_message_with_retry(const uint8_t* data, uint16_t length, uint16_t sequence) {
    // 发送消息
    int result = network_manager_send(&net_manager, data, length);
    if (result != 0) {
        return result;
    }

    // 添加到重发管理器
    return mcp_retry_manager_add_message(&retry_manager, sequence, data, length,
                                        resend_message_callback,
                                        message_success_callback,
                                        NULL);
}

// 处理服务器响应
void handle_server_response(uint16_t sequence) {
    mcp_retry_manager_handle_response(&retry_manager, sequence);
}

// 清理
void cleanup() {
    mcp_retry_manager_cleanup(&retry_manager);
    network_manager_cleanup(&net_manager);
}
